package com.example.experiment5;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class CameraActivity extends AppCompatActivity {
    public static final int TAKE_PHOTO = 1; // 声明一个状态码，用于识别返回的结果
    private ImageView picture;
    private Uri ImageUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        requestPermission();  // 权限申请
        Button takePhoto = (Button) findViewById(R.id.take_photo);
        picture = (ImageView) findViewById(R.id.picture);
        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*
                    创建File对象，用于存储拍照后的图片，把这个图片命名为output_image.jpg，
                    并把它存放在应用关联缓存目录下，调用getExternalCacheDir()可以得到这个目录
                    由于android6.0开始，读写sd卡列为了危险权限，使用的时候必须要有权限，
                    应用关联目录则可以跳过这一步
                 */
                File outputImage = new File(getExternalCacheDir(), "outputImage.jpg");
                try {
                    // 判断图片是否存在，存在则删除在创建，不存在则直接创建
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 判断安卓的版本是否高于7.0，高于则调用高于的方法，低于则调用低于的方法
                if (Build.VERSION.SDK_INT >= 24) {
                    // FileProvider是一种特殊的内容提供器，可以对数据进行保护
                    ImageUri = FileProvider.getUriForFile(CameraActivity.this,
                            "com.example.experiment5.fileprovider", outputImage);
                } else {
                    ImageUri = Uri.fromFile(outputImage);
                }
                // 启动相机程序
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUri);
                startActivityForResult(intent, TAKE_PHOTO);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        //将拍摄的照片显示出来
                        Bitmap bitmap = BitmapFactory.decodeStream(
                                getContentResolver().openInputStream(ImageUri));
                        picture.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            default:
                break;
        }
    }

    /**
     * 申请权限
     */
    public static final int CAMERA_REQ_CODE = 111;

    private void requestPermission() {
        // 判断当前Activity是否已经获得了该权限
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // 如果App的权限申请曾经被用户拒绝过，就需要在这里跟用户做出解释
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.CAMERA)) {
                Toast.makeText(CameraActivity.this,
                        "请进入设置-应用管理-打开相机权限",
                        Toast.LENGTH_SHORT).show();
            } else {
                ActivityCompat.requestPermissions( // 进行权限请求
                        this,
                        new String[]{Manifest.permission.CAMERA},
                        CAMERA_REQ_CODE);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[],
                                           int[] grantResults) {
        switch (requestCode) {
            case CAMERA_REQ_CODE: { // 如果请求被拒绝，那么通常grantResults数组为空
                if (grantResults.length > 0 && grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED) {
                    // 申请成功，进行相应操作
                } else { // 申请失败，可以继续向用户解释。
                    Toast.makeText(CameraActivity.this,
                            "没有相机权限,您可能无法使用相机",
                            Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }
}

